package thread;
class Singleton2{
    private volatile static Singleton2 instance=null;//volatile在这里的作用是禁止指令重排序,
    /**
     * new分为3步
     * 1.申请一块空间
     * 2.加载内存
     * 3.将内存地址赋给该实例
     * 但是有时会进行优化,会优化成2.3步,那么这样在另外一个线程进行判断的时候,
     * 就会判断错误,给力地址不为空,但是内存并没有进行加载,
     * 这样导致另外一个线程用返回的实例使用里面的方法时就会进行报错,导致程序崩溃
     */
  public static  Object locker=new Object();
    public  static Singleton2 getInstance() {
        if(instance==null) {//为了确保执行效率,判断是不是第一次进行判断,避免加锁造成的效率降低
            synchronized (locker) {//避免多个线程一起执行到这里,避免两个if都进去了,所以进行加锁
                if (instance == null) {//判断实例是否为空,如果为空,则进行第一次创建
                    instance = new Singleton2();
                }
            }
        }
        return instance;
    }

    private Singleton2(){

    }
}

public class ThreadDemo24 {
}
